#include<stdio.h>

//函数的传参 方式之复制传参：将实参的值传递给形参，不管形参怎么变，跟实参都没有关系
void fun1(int a, int b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;

	printf("in fun1:a= %d,b= %d\n",a,b);
	printf("&a= %p,&b= %p\n",&a,&b);

}

//函数的传参方式之 地址传参，形参对保存的地址的内容进行任何操作，实参的值也会跟着改变
void fun2(int *p,int *q)
{
	int temp;
	temp=*p;
	*p=*q;
	*q=temp;

	printf("in fun2: *p= %d,*q= %d\n",*p,*q);
	printf("p= %p,q= %p\n",p,q);

}


void test1()
{
	int a=100,b=20;
	printf("before fun :a= %d,b= %d\n",a,b);
	printf("&a= %p,&b= %p\n",&a,&b);

	fun1(a,b);
	fun2(&a,&b);

	printf("after fun :a= %d,b= %d\n",a,b);

}

/*
void test2()
{
	int a=100,b=20;
	printf("before fun :a= %d,b= %d\n",a,b);
	printf("&a= %p,&b= %p\n",&a,&b);

	fun2(a,b);


	printf("after fun :a= %d,b= %d\n",a,b);
*/

//传一维数组
//void fun3(int p[])//形式一
void fun3(int *p)//形式二 常用
{
	printf("一维数组传参结果\n");
	printf("%d\n",p[2]);
	printf("%d\n",*(p+3));
}

void test3()
{
	int a[10]={1,2,3,4,5,6,7,8};
	fun3(a);
}

//传二维数组
//void fun4(int p[][4])//形式一
void fun4(int (*p)[4])//形式二：通过数组指针
{
	//p[x][y]<=>*(*(p+x)+y)
	printf("二维数组传参结果\n");
	printf("%d\n",p[0][2]);
	printf("%d\n",*(*(p+1)+2));
}

void test4()
{
	int a[2][4]={1,2,3,4,5,6,7,8};
	fun4(a);
}

//传指针数组
void fun5(char **q)
{
	int i;
	for(i=0;i<3;i++)
			printf("传指针数组结果 ：%s\n",q[i]);
}
void test5()
{
	char *p[3]={"Hello","World","Do not cry"};
	fun5(p);
}

int main()
{
	test1();
//	test2();
	test3();
	test4();
	test5();

	return 0;
}



